package com.insight.modules.system.service;

import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanqiao.insight.acore.depart.entity.SysDepart;
import com.insight.common.api.vo.Result;
import com.insight.common.system.vo.LoginUser;
import com.insight.modules.system.model.DepartIdModel;
import com.insight.modules.system.model.SysDepartTreeModel;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 部门表 服务实现类
 * <p>
 *
 * @Author:Steve
 * @Since： 2019-01-22
 */
/**
 * 系统部门管理服务接口
 * 继承 MyBatis-Plus 的 IService，提供部门相关业务操作方法
 */
public interface ISysDepartService extends IService<SysDepart> {

    /**
     * 查询当前用户拥有权限的部门树结构，支持多部门id传入，分节点显示
     *
     * @param departIds 多个部门ID，逗号分隔
     * @return 部门树形结构列表
     */
    List<SysDepartTreeModel> queryMyDeptTreeList(String departIds);

    /**
     * 查询所有部门的树形结构，用于树形展示
     *
     * @return 部门树形结构列表
     */
    List<SysDepartTreeModel> queryTreeList();

    /**
     * 根据当前登录用户查询其可见的部门列表，返回树形结构
     *
     * @param sysUser 当前登录用户信息
     * @return 部门列表
     */
    List<SysDepart> queryTreeList(LoginUser sysUser);

    /**
     * 查询所有部门ID的树形结构（仅部门ID信息）
     *
     * @return 部门ID树形列表
     */
    List<DepartIdModel> queryDepartIdTreeList();

    /**
     * 新增保存部门数据
     *
     * @param sysDepart 部门实体
     * @param username  当前操作用户的用户名
     * @return 处理结果，包含操作状态和信息
     */
    Result<?> saveDepartData(SysDepart sysDepart, String username);

    /**
     * 根据部门ID更新部门信息
     *
     * @param sysDepart 更新后的部门实体
     * @param username  当前操作用户的用户名
     * @return 处理结果，包含操作状态和信息
     */
    Result<?> updateDepartDataById(SysDepart sysDepart, String username);

    /**
     * 通过关键字搜索部门数据，支持按关键字模糊匹配，同时可限制搜索范围
     *
     * @param keyWord       关键字
     * @param myDeptSearch  是否仅搜索当前用户部门相关
     * @param departIds     当前用户部门ID范围，用于过滤
     * @return 符合条件的部门树形结构列表
     */
    List<SysDepartTreeModel> searhBy(String keyWord, String myDeptSearch, String departIds);

    /**
     * 根据部门ID删除部门及其可能存在的所有子级部门
     *
     * @param id 部门ID
     * @return 是否删除成功
     */
    boolean delete(String id);

    /**
     * 查询指定用户关联的部门集合
     *
     * @param userId 用户ID
     * @return 关联部门列表
     */
    List<SysDepart> queryUserDeparts(String userId);

    /**
     * 根据用户名查询用户所属部门列表
     *
     * @param username 用户名
     * @return 部门列表
     */
    List<SysDepart> queryDepartsByUsername(String username);

    /**
     * 批量删除部门及其子部门
     *
     * @param ids 部门ID列表
     */
    void deleteBatchWithChildren(List<String> ids);

    /**
     * 根据部门ID查询当前部门及其所有下级部门ID集合
     *
     * @param departId 部门ID
     * @return 包含当前部门及下级部门ID的列表
     */
    List<String> getSubDepIdsByDepId(String departId);

    /**
     * 获取我的部门下所有下级部门ID
     *
     * @param departIds 我的部门ID集合，逗号分隔
     * @return 下级部门ID列表
     */
    List<String> getMySubDepIdsByDepId(String departIds);

    /**
     * 根据关键字查询部门信息，主要用于通讯录功能
     *
     * @param keyWord 关键字
     * @return 部门树形结构列表
     */
    List<SysDepartTreeModel> queryTreeByKeyWord(String keyWord);

    /**
     * 获取部门信息映射，key为部门ID，value为部门名称
     *
     * @return 部门ID到名称的映射
     */
    Map<String, String> getDepartMap();

    /**
     * 根据部门ID查询部门名称
     *
     * @param departmentId 部门ID
     * @return 部门名称
     */
    String selectNameById(String departmentId);

    /**
     * 通过部门编码获取部门信息列表
     *
     * @param orgCode 部门编码
     * @return 部门列表
     */
    List<SysDepart> getSysDepartByOrgCode(String orgCode);

    /**
     * 通过部门编码获取单个部门信息
     *
     * @param orgCode 部门编码
     * @return 部门实体
     */
    SysDepart getDepartByOrgCode(String orgCode);

    /**
     * 根据用户信息获取其关联的部门列表
     *
     * @param sysUser 登录用户
     * @return 部门列表
     */
    List<SysDepart> getDepLists(LoginUser sysUser);

    /**
     * 导入部门数据（多sheet导入）
     *
     * @param file 上传的部门数据文件
     * @return 操作结果
     */
    Result<?> importSheets(MultipartFile file);

    /**
     * 测试部门移动功能
     *
     * @param id 部门ID
     * @return 移动结果描述
     */
    String testMove(String id);

    /**
     * 获取我的部门的父部门编码数组
     *
     * @param departIds 我的部门ID集合
     * @return 父部门编码数组
     */
    String[] getMyDeptParentOrgCode(String departIds);

    /**
     * 同步部门信息（通过JSONObject格式的部门数据）
     *
     * @param org 部门信息JSONObject
     * @return 同步结果状态码
     */
    int syncDepart(JSONObject org);

    /**
     * 根据部门编码数组批量查询部门信息
     *
     * @param departCode 部门编码数组
     * @return 部门列表
     */
    List<SysDepart> queryByCodes(String[] departCode);

    /**
     * 查询指定父部门ID及其子部门，返回树形结构列表
     *
     * @param parentId 父部门ID
     * @param ids      多个部门ID（逗号分隔）
     * @return 部门树形结构列表
     */
    List<SysDepartTreeModel> queryTreeListByPid(String parentId, String ids);

    /**
     * 同步资源部门信息（JSONArray格式）
     *
     * @param org     部门JSONArray数据
     * @param isFirst 是否为首次同步
     */
    void syncZyDepart(JSONArray org, boolean isFirst);

    /**
     * 同步 ZJG 部门信息
     *
     * @param sysDeparts ZJG部门列表
     */
    void syncZJGDepart(List<SysDepart> sysDeparts);

    /**
     * 根据区域ID列表查询部门列表
     *
     * @param areaIdList 区域ID列表
     * @return 部门列表
     */
    List<SysDepart> queryListByAreaId(List<String> areaIdList);
}

